package aplicacion.modelo;


public class Juego {
	private Tablero tablero;
	private Puntaje puntaje;
	private int nivel;
	private int vidasRestantes;
	private int duracionPastillaMagica;
	private boolean perdido;
	private boolean estaPausado;
	private static final int CANTIDADDEVIDAS=3; 
	private static final String RUTA_ARCHIVO_MAPA="./Config/pantalla.cfg";
	private static Juego JUEGO = null;
	
	private Juego() {}
	
	public static Juego getInstance() {
		if(JUEGO == null) {
			JUEGO = new Juego(RUTA_ARCHIVO_MAPA);
		}
		return JUEGO;
	}
	
	public static void reinicializarJuego() {
		JUEGO = null;
	}
	
	private Juego(String rutaArchivoConfiguracion){
		this.vidasRestantes=CANTIDADDEVIDAS;
		this.setNivel(1);
		this.setTablero(new Tablero(rutaArchivoConfiguracion));
		this.perdido=false;
		this.puntaje=new Puntaje();
	}
	
	public void iniciarNuevoNivel() {
		setNivel(getNivel() + 1);
		this.setTablero(new Tablero(RUTA_ARCHIVO_MAPA));
		PastillaMagica.decrementarDuracion();
		Fantasma.decrementarTiempoDeResurreccion();
	}
	
	public void restarVidas(){
		this.vidasRestantes--;		
		if(vidasRestantes==0){			
			perdido=true;
			int puntajeDelJuego=Juego.getInstance().getPuntaje().getPuntaje();
			int PosicionEnTablaDePuntaje=PuntajeMaximo.getInstance().buscarPosicion(puntajeDelJuego);
			if (PosicionEnTablaDePuntaje<10){				
				PuntajeMaximo.getInstance().agregar(puntajeDelJuego, PuntajeMaximo.getInstance().getNombrePuntajeMaximo());
				PuntajeMaximo.getInstance().persistir();				
			}						
		}
   	}		 	
	
	public int getVidasRestantes(){
		return this.vidasRestantes;
	}
	
	public void aumentarPuntaje(int puntos){
		puntaje.aumentarPuntaje(puntos);		
	}
	
	public Puntaje getPuntaje(){
		return puntaje;
	}
	
	public void perder(){
		this.perdido=true;
	}
	
	public boolean estaPerdido(){
		return perdido;
	}

	public void setTablero(Tablero tablero) {
		this.tablero = tablero;
	}

	public Tablero getTablero() {
		return tablero;
	}

	public int getDuracionPastillaMagica() {
		return duracionPastillaMagica;
	}

	public void decrementarDuracionPastillaMagica() {
		duracionPastillaMagica--;
	}

	public void setDuracionPastillaMagica(int duracionEnGameloops) {
		duracionPastillaMagica = duracionEnGameloops;
	}

	public boolean estaPausado() {
		return estaPausado;
	}
	
	public void pausar() {
		estaPausado = !estaPausado; 
	}

	public boolean pasoDeNivel() {
		return getTablero().getCantidadPastillas() == 0;
	}

	private void setNivel(int nivel) {
		this.nivel = nivel;
	}

	public int getNivel() {
		return nivel;
	}
}
